package HOT;

import java.util.Arrays;

/**
 * Author  zxy
 * Date  2023/7/14 15:52
 */

/*
* 给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。
* 完全平方数 是一个整数，其值等于另一个整数的平方；
* 换句话说，其值等于一个整数自乘的积。
* 例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。
* */

public class NumSquares_279 {
    public int numSquares(int n) {

        int[] arrs = new int[n + 1];

        // 动态规划
        /*
        Arrays.fill(arrs, Integer.MAX_VALUE);

        for (int i = 1; i <= n; i++) {
            if (isNum(i)) {
                arrs[i] = 1;
            }
            else {
                for (int j = 1; j <= i / 2; j++) {
                    arrs[i] = Math.min(arrs[i], arrs[j] + arrs[i - j]);
                }
            }
        }
        */

        // 优化
        for (int i = 1; i <= n; i++) {
            arrs[i] = i;

            for (int j = 1; j * j <= i; j++) {
                arrs[i] = Math.min(arrs[i], arrs[i - j * j]);
            }
            arrs[i]++;
        }

        return arrs[n];
    }

    // 判断是否为完全平方数
    public boolean isNum(int num) {
        int left = 1;
        int right = num;

        while (left <= right) {
            int mid = (left + right) / 2;
            int mul = mid * mid;

            if (mul == num) {
                return true;
            } else if (mul < num) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return false;
    }
}
